package com.njchy.statistics.service.impl;

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONObject;
import com.njchy.statistics.entity.RiverInfo;
import com.njchy.statistics.entity.dto.RiverExcelDTO;
import com.njchy.statistics.mapper.AllMapper;
import com.njchy.statistics.service.UploadFileService;
import com.njchy.statistics.util.FileUploadUtil;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Service
@AllArgsConstructor
public class UploadFileServiceImpl implements UploadFileService {

    private final AllMapper allMapper;
    private final FileUploadUtil fileUploadUtil;


    /**
     * 批量上传数据入库
     *
     * @param file
     */
    @Override
    public boolean getUploadExcel(MultipartFile file) {
        // 1. 校验文件是否为空
        if (file == null || file.isEmpty()) {
            System.err.println("错误：上传的Excel文件为空");
            return false;
        }

        // 2. 校验文件类型（增强安全性）
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null ||
                (!originalFilename.toLowerCase().endsWith(".xlsx") &&
                        !originalFilename.toLowerCase().endsWith(".xls"))) {
            System.err.println("错误：仅支持.xlsx和.xls格式的Excel文件");
            return false;
        }

        InputStream inputStream = null;
        try {
            // 3. 获取文件输入流
            inputStream = file.getInputStream();

            // 4. 读取Excel数据（同步读取方式）
            List<RiverExcelDTO> excelDataList = EasyExcel.read(inputStream)
                    .head(RiverExcelDTO.class)  // 指定表头映射类
                    .sheet()                    // 读取第一个工作表
                    .doReadSync();              // 同步读取

            // 5. 处理空数据场景
            if (excelDataList == null || excelDataList.isEmpty()) {
                System.out.println("警告：Excel文件中没有有效数据");
                return true;  // 空文件不算失败
            }

            // 6. DTO转实体类（核心：补充数据转换逻辑）
            List<RiverInfo> riverList = new ArrayList<>();
            Date now = new Date();  // 统一创建时间，避免循环中重复实例化
            for (RiverExcelDTO excelDTO : excelDataList) {
                // 校验Excel行数据有效性（避免空行或关键字段缺失）
                if (excelDTO.getRiverName() == null || excelDTO.getRiverName().trim().isEmpty()) {
                    System.err.println("警告：河流名称为空，跳过此行数据");
                    continue;
                }
                // DTO转实体类
                RiverInfo river = new RiverInfo();
                river.setRiverNumber(excelDTO.getRiverNumber());
                river.setRiverName(excelDTO.getRiverName().trim());  // 去除首尾空格
                river.setRiverStart(excelDTO.getRiverStart());
                river.setRiverEnd(excelDTO.getRiverEnd());
                river.setRiverLength(excelDTO.getRiverLength());
                river.setRiverArea(excelDTO.getRiverArea());
                river.setRiverTotalVolume(excelDTO.getRiverTotalVolume());
                river.setDescription("");
                river.setSourceUrl("");
                river.setCreateTime(LocalDateTime.now());  // 统一设置创建时间
                river.setUpdateTime(LocalDateTime.now());  // 初始更新时间与创建时间一致
                riverList.add(river);
            }

            // 7. 批量保存/更新数据（使用之前定义的"同名更新"逻辑）
            if (!riverList.isEmpty()) {
                // 调用Mapper的批量插入或更新方法
                allMapper.batchInsertOrUpdate(riverList);
                System.out.println("成功处理 " + riverList.size() + " 条数据");
            } else {
                System.out.println("警告：所有Excel数据均无效，未执行入库操作");
            }

            return true;

        } catch (IOException e) {
            System.err.println("文件读取失败：" + e.getMessage());
            e.printStackTrace();  // 打印堆栈信息，便于排查问题
        } catch (Exception e) {
            System.err.println("Excel处理失败：" + e.getMessage());
            e.printStackTrace();
        } finally {
            // 确保输入流关闭，避免资源泄漏
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    System.err.println("流关闭失败：" + e.getMessage());
                }
            }
        }

        return false;
    }


    /**
     *
     * 文件上传
     * @param files
     * @return
     */
    @Override
    public String getUploadImages(MultipartFile files) {
        return fileUploadUtil.fileUploadProd(files);
    }
}
